package manager.modulo.estoque.dao;

import java.sql.SQLException;
import manager.auxiliares.MensagemExcessao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.LinkedList;
import manager.principal.fonte.JanelaLogin;
import manager.interfaces.InterfaceDao;
import manager.modulo.orcamento.enumerator.EnumTipoItemOrcamento;
import manager.modulo.orcamento.enumerator.EnumTipoItemOrcamento.TipoItemOrcamento;

/**
 * Esta classe será utilizada para cadastra a entidade user no banco de dados
 *
 * @author Thiago
 */
public class ItemComposicaoDao implements InterfaceDao {

    private int id;
    private int idInsumo;
    private int idComposicao;
    private int idComposicaoPai;
    private int quantidade;
    private int valorUnitario;
    private TipoItemOrcamento tipoItem;

    /**
     * Inicializando as variáveis
     */
    public ItemComposicaoDao() {
        idInsumo = 0;
        idComposicaoPai = 0;
        quantidade = 0;
        idComposicao = 0;
        tipoItem = TipoItemOrcamento.NAOENCONTRADO;
        valorUnitario = 0;
    }

    public static LinkedList<ItemComposicaoDao> listarItemPorComposicaoPai(int idComposicao) {
        LinkedList<ItemComposicaoDao> result = new LinkedList<ItemComposicaoDao>();
        try {
            String sql = "SELECT id FROM item_composicao WHERE id_composicao_pai = ? ";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, idComposicao);
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                ItemComposicaoDao itemComposicaoDao = new ItemComposicaoDao();
                itemComposicaoDao.buscar(resultSet.getInt("id"));
                result.add(itemComposicaoDao);
            }
            return result;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Insumos");
        }
        return result;
    }

    /**
     * Carregar as informações do objeto usuário a partir de um id
     *
     * 
     * 
     * 
     * 
     * 
     * @param id Id do usuário buscado
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM item_composicao WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                quantidade = resultSet.getInt("nm_quantidade");
                valorUnitario = resultSet.getInt("nm_valor_unitario");
                idInsumo = resultSet.getInt("id_insumo");
                idComposicaoPai = resultSet.getInt("id_composicao_pai");
                idComposicao = resultSet.getInt("id_composicao");
                tipoItem = EnumTipoItemOrcamento.ConverterNumeroEnum(resultSet.getInt("cd_tipo_item"));
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Relação Item Composição");
        }
    }

    /**
     * Insere um usuário no banco
     */
    public void inserir() throws SQLException {

        String sql = "INSERT INTO item_composicao "
                + "( nm_quantidade,"
                + " id_insumo,"
                + " id_composicao,"
                + " cd_tipo_item,"
                + " nm_valor_unitario,"
                + " id_composicao_pai) "
                + "VALUES ("
                + "?," // 01 Quantidae
                + "?," // 02 Insumo
                + "?," // 03 Composicao
                + "?," // 04 Tipo Item
                + "?," // 05 Valor Unitário
                + "? )"; // 06 Composicao Pai
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setInt(1, quantidade);
        preparedStatement.setInt(2, idInsumo);
        preparedStatement.setInt(3, idComposicao);
        preparedStatement.setInt(4, EnumTipoItemOrcamento.ConverterEnumNumero(tipoItem));
        preparedStatement.setInt(5, valorUnitario);
        preparedStatement.setInt(6, idComposicaoPai);

        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    public void atualizar() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void deletar() throws SQLException {
        String sql = "DELETE FROM item_composicao WHERE id_composicao_pai = ? "; // 
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setInt(1, idComposicaoPai);

        preparedStatement.executeUpdate();

        preparedStatement.close();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getIdInsumo() {
        return idInsumo;
    }

    public void setIdInsumo(int idInsumo) {
        this.idInsumo = idInsumo;
    }

    public int getIdComposicao() {
        return idComposicao;
    }

    public void setIdComposicao(int idComposicao) {
        this.idComposicao = idComposicao;
    }

    public int getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(int quantidade) {
        this.quantidade = quantidade;
    }

    public int getIdComposicaoPai() {
        return idComposicaoPai;
    }

    public void setIdComposicaoPai(int idComposicaoPai) {
        this.idComposicaoPai = idComposicaoPai;
    }

    public TipoItemOrcamento getTipoItem() {
        return tipoItem;
    }

    public void setTipoItem(TipoItemOrcamento tipoItem) {
        this.tipoItem = tipoItem;
    }

    public int getValorUnitario() {
        return valorUnitario;
    }

    public void setValorUnitario(int valorUnitario) {
        this.valorUnitario = valorUnitario;
    }

    public LinkedList<String> buscar(String opcao, String buscado, boolean limite) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}
